﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlServerCe;
using System.Data;
using System.ComponentModel;


namespace GestionaleLib.Controller
{
    public class ctrlDocumenti
    {
        int Protocollo;
        #region "Testata"
        #region "Proprietà"
        private Connector Connessione;
        #endregion
        public enum Insert
        {
            Successo,
            Errore
        }
        public enum Edit
        {
            Successo,
            Errore
        }
        public enum Delete
        {
            Successo,
            Errore
        }
        #endregion
        public ctrlDocumenti()
        {
            Connessione = Connector.Istance();
        }

        //Verifica Protocollo
        public int VerificaProtocolloDocumento(Documento Documenti)
        {

            int Scadenza;
            bool insertProtocollo;

            insertProtocollo = false;

            
            TipoPagamento Pagamento = new TipoPagamento();
            //Protocollo = new ctrlProtocolli().UltimoProgressivo(Documenti.Protocollo);
            if (Documenti.ProgressivoDoc > 0)
            {
                //Documenti.ProgressivoDoc = Documenti.ProgressivoDoc + 1;
          
                try
                {
                    string sqlUpdtProtocollo = @"UPDATE Protocollo SET
                                                Nome=@Nome,Progressivo=@Progressivo,DataAggiornamento=@DataAggiornamento
                                                WHERE Id=@Id";
                    SqlCeCommand cmdProtocollo = new SqlCeCommand(sqlUpdtProtocollo, Connessione.Connessione);

                    cmdProtocollo.Parameters.AddWithValue("@Nome", Documenti.TipoDoc);
                    cmdProtocollo.Parameters.AddWithValue("@Progressivo", Documenti.ProgressivoDoc);
                    cmdProtocollo.Parameters.AddWithValue("@DataAggiornamento", DateTime.Now);
                    cmdProtocollo.Parameters.AddWithValue("@Id", Documenti.IDProtocollo);
                    cmdProtocollo.ExecuteNonQuery();
                    return Documenti.ProgressivoDoc;

                }

                catch
                {
                    insertProtocollo = false;
                    throw new ExceptionErroreInserimento();
                }
            }
            else
            {
                Protocollo = 1;
                try
                {
                    Guid Id = new Protocollo().Id;
 
                    //Inserisci Protocollo
                    string sqlProt = @"INSERT INTO Protocollo (Id,Nome,Progressivo,DataAggiornamento)
                                                      VALUES (@Id,@Nome,@Progressivo,@DataAggiornamento)";
                    SqlCeCommand cmdProtocollo = new SqlCeCommand(sqlProt, Connessione.Connessione);
                    cmdProtocollo.Parameters.AddWithValue("@Id", Documenti.IDProtocollo);
                    cmdProtocollo.Parameters.AddWithValue("@Nome", Documenti.TipoDoc);
                    cmdProtocollo.Parameters.AddWithValue("@Progressivo", Documenti.ProgressivoDoc);
                    cmdProtocollo.Parameters.AddWithValue("@DataAggiornamento", DateTime.Now);

                    cmdProtocollo.ExecuteNonQuery();

                    return Protocollo;
                }
                catch 
                {
            
                    throw new ExceptionErroreInserimento();
                }
            }
            return Protocollo;
        }

        //Inserimento Documento Testata
        public bool InsertDocumentoTestata(Documento Documenti)
        {

            //Documenti.ProgressivoDoc = Documenti.ProgressivoDoc + 1;
            //Inserisco la testata del documento
            try
            {

                string sql = @"INSERT INTO Documenti (Id,AnnoEsercizio,IdProtocollo,DataEmissione,DataScadenza,IdPagamento,
                                                        ProgressivoDocumento,TipologiaDocumento)
                                 VALUES(@Id,@AnnoEsercizio,@IdProtocollo,@DataEmissione,@DataScadenza,@IdPagamento,
                                        @ProgressivoDocumento,@TipologiaDocumento)";
                SqlCeCommand cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                cmdDocumenti.Parameters.AddWithValue("@Id", Documenti.Id);
                cmdDocumenti.Parameters.AddWithValue("@AnnoEsercizio", Documenti.AnnoEsercizio);
                cmdDocumenti.Parameters.AddWithValue("@IdProtocollo", Documenti.IDProtocollo);
                cmdDocumenti.Parameters.AddWithValue("@DataEmissione", Documenti.DataEmissione);
                cmdDocumenti.Parameters.AddWithValue("@DataScadenza", Documenti.DataScadenza);
                cmdDocumenti.Parameters.AddWithValue("@IdPagamento", Documenti.Pagamento.Id);
                cmdDocumenti.Parameters.AddWithValue("@ProgressivoDocumento", Documenti.ProgressivoDoc);
                cmdDocumenti.Parameters.AddWithValue("@TipologiaDocumento", Documenti.TipoDoc);

                cmdDocumenti.ExecuteNonQuery();
                return true; 
            }
            catch 
            {
                return false;
                 throw new ExceptionErroreInserimento();
            }
        }


        //Inserimento Documento Corpo
        public Insert InsertNuovoDocumentoCorpo(DocumentoDettaglio Documenti)
        {
            //Inserisco il Dettaglio del documento
            try
            {
                Guid Id = new DocumentoDettaglio().Id;
                string sql = @"INSERT INTO DocumentiDettagli (Id,IdDocumento,IdProdotto,IdPiede,Quantita,Sconto)
                                 VALUES(@Id,@IdDocumento,@IdProdotto,@IdPiede,@Quantita,@Sconto)";
                SqlCeCommand cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                cmdDocumenti.Parameters.AddWithValue("@Id", Id);
                cmdDocumenti.Parameters.AddWithValue("@IdDocumento", Documenti.IdDocumentoTestata);
                cmdDocumenti.Parameters.AddWithValue("@IdProdotto", Documenti.Prodotto.Id);
                cmdDocumenti.Parameters.AddWithValue("@IdPiede", Documenti.Piede.Id);
                cmdDocumenti.Parameters.AddWithValue("@Quantita", Documenti.Quantita);
                cmdDocumenti.Parameters.AddWithValue("@Sconto", Documenti.Sconto);

                cmdDocumenti.ExecuteNonQuery();
                return Insert.Successo;

            }
            catch
            {

                throw new ExceptionErroreInserimento();
            }

        }


        //Inserimento Documento Piede
        public Insert InsertNuovoDocumentoPiede(DocumentoPiede Documenti)
        {

            //Inserisco il piede
            try
            {
                Guid Id = new DocumentoPiede().Id;

                string sql = @"INSERT INTO DocumentiPiedi (Id,IdDocumento,TotaleDaPagare,TotaleImposta,TotaleImponibile)
                                 VALUES(@Id,@IdDocumento,@TotaleDaPagare,@TotaleImposta,@TotaleImponibile)";
                SqlCeCommand cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                cmdDocumenti.Parameters.AddWithValue("@Id", Id);
                cmdDocumenti.Parameters.AddWithValue("@IdDocumento", Documenti.IdDocumentoTestata);
                cmdDocumenti.Parameters.AddWithValue("@TotaleDaPagare", Documenti.TotaleDaPagare);
                cmdDocumenti.Parameters.AddWithValue("@TotaleImposta", Documenti.TotaleImposta);
                cmdDocumenti.Parameters.AddWithValue("@TotaleImponibile", Documenti.TotaleImponibile);

                cmdDocumenti.ExecuteNonQuery();
                return Insert.Successo;


            }
            catch
            {
                throw new ExceptionErroreInserimento();
            }
        }

        public Delete PulisciDatabase()
        {
                try 
	            {
                    string sql = @"DELETE FROM Protocollo";
                    SqlCeCommand cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Documenti";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM DocumentiDettagli";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM DocumentiPiedi";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Prodotti";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Parametri";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Taglia";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Tessera";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Aliquota";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Banca";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Clienti";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Fornitori";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Deposito";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Magazzino";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Parametri";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM Pagamento";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    sql = @"DELETE FROM DocumentiTipo";
                    cmdDocumenti = new SqlCeCommand(sql, Connessione.Connessione);
                    cmdDocumenti.ExecuteNonQuery();
                    cmdDocumenti = null;

                    return Delete.Successo;
	            }
	            catch (Exception)
	            {

                    return Delete.Errore;
	            }
                        
        }


        public List<Documento> Documenti()
        {
            string columns;
            Guid ID;

            string sql = @"SELECT *
                            FROM  Documenti 
                                ";

            SqlCeDataAdapter com = new SqlCeDataAdapter(sql, Connessione.Connessione);
            DataTable dt = new DataTable();
            com.Fill(dt);
            List<Documento> ListaRitorno = new List<Documento>();
            if (dt.Rows.Count > 0)
            {
                
                foreach (DataRow item in dt.Rows)
                {

                    Documento DocumentoRitorno = new Documento();

                    ID = (Guid)item["IdProtocollo"];
                    DocumentoRitorno.Id = (Guid)item["Id"];
                    DocumentoRitorno.ProgressivoDoc = Convert.ToInt32(item["ProgressivoDocumento"]);
                    DocumentoRitorno.TipoDoc = (string)item["TipologiaDocumento"];
                    DocumentoRitorno.DataScadenza = Convert.ToDateTime(item["DataScadenza"]);
                    DocumentoRitorno.DataEmissione = Convert.ToDateTime(item["DataEmissione"]);
                    DocumentoRitorno.AnnoEsercizio = (int)item["AnnoEsercizio"];


                    ListaRitorno.Add(DocumentoRitorno);
                    
                }
                
            }
            return ListaRitorno;
        }
    }
}

